import numpy as np


# def find_bad_w(w, error, t, n):
#     """ 计算曲线的反应谱，和设计谱进行比较后，由本函数返回误差最大的频率点
#     :param w:     频率序列
#     :param error: 误差序列
#     :param t:   反应谱横坐标 特征周期序列
#     :param n:     要修正的频率点数
#     :return:
#     """
#     ind = np.zeros(n)  # 初始化一个向量，记录误差最大的频率点位于频率序列的位置
#     # 找到当前曲线中反应谱值误差最大的N个周期点对应的频率点
#     error = list(error.copy())
#     sorted_error = error.copy()
#     sorted_error.sort(reverse=True)  # 将误差从大到小排列
#     target_T = np.zeros(n)  # 目标周期点
#     for i in range(n):
#         target_T[i] = t[error.index(sorted_error[i])]  # 这一步找出误差最大的特征周期点
#         # 下面把周期点换成频率点
#         if target_T[i] == 0:  # 针对零周期加速度做特殊处理
#             ind[i] = w[-1]
#         else:
#             a = list(abs(w - 2 * np.pi / target_T[i]))
#             ind[i] = a.index(min(a)) # 找到距离目标周期点最近的频率的索引位置
#         if i != 0:  # 从第二位开始判断
#             j = i
#             add = np.zeros(n)
#             add[i] = 1
#             while all(ind - ind[i] + add) == 0:  # 通过加上add让原位不为0
#                 # 如果这个频率已重复,找误差序列上的下一个点
#                 # 可能邻近的几个特征周期点误差恰好是最大的几个，那么对应频率可能重复
#                 j += 1
#                 target_T[i] = t[error.index(sorted_error[j])]  # 这一步找出误差最大的特征周期点
#                 # 下面把周期点换成频率点
#                 if target_T[i] == 0:  # 针对零周期加速度做特殊处理
#                     ind[i] = w[-1]
#                 else:
#                     a = list(abs(w - 2 * np.pi / target_T[i]))
#                     ind[i] = a.index(min(a))  # 找到距离目标周期点最近的频率的索引位置
#     ind = ind.astype(int)
#     return ind

def find_bad_w(w, error, t, n):
    """ 计算曲线的反应谱，和设计谱进行比较后，由本函数返回误差最大的频率点
    :param w:     频率序列
    :param error: 误差序列
    :param t:     反应谱横坐标 特征周期序列  和error维度相同
    :param n:     要修正的频率点数
    :return:
    """
    ind = np.zeros(n)  # 初始化一个向量，记录误差最大的频率点位于频率序列的位置
    # 找到当前曲线中反应谱值误差最大的N个周期点对应的频率点
    error = list(error.copy())
    sorted_error = error.copy()
    sorted_error.sort(reverse=True)  # 将误差从大到小排列
    local_w = w.copy()
    for i in range(n):
        target_T = t[error.index(sorted_error[i])]  # 这一步找出误差最大的特征周期点
        if target_T == 0:  # 高频滤除 防止除以0
            ind[i] = len(w) - 1
            continue
        # 下面把周期点换成频率点
        a = list(abs(local_w - 2 * 3.1415926 / target_T))
        pos = a.index(min(a))  # 找到距离目标周期点最近的频率的索引位置
        local_w[pos] = 1000000  # 该频率已经进入队列 不再加入寻找
        ind[i] = pos  # 找到距离目标周期点最近的频率的索引位置
    ind = ind.astype(int)
    return ind
